﻿using System;
using System.Linq;
using Caliburn.Micro;
using WPCloudPT.Eventos;
using WPCloudPT.Model;
using WPCloudPT.Model.DbModel;

namespace WPCloudPT.Service
{
    #region ToImplement
    /// <summary>
    /// implementar sql ce database para evitar chamadas remotas constantes
    /// </summary>
    public class CloudPtDataService
    {
        private static CloudPtDataService _instance;

        public BindableCollection<InformacaoPastas> DadosPastas { get; set; }
        public Utilizador TmpUserDb { get; set; }
        private CloudPtContext _context;

        #region Ctor

        public static CloudPtDataService GetInstance()
        {
            lock (typeof (CloudPtDataService))
            {
                return _instance ?? (_instance = new CloudPtDataService());
            }
        }

        #endregion

        #region GetDataPastas

        public BindableCollection<InformacaoPastas> GetDados()
        {
            return DadosPastas ?? DadosPastas;
        }

        #endregion
        #region DadosUtilizador

        #region GetUserInformation
        public Utilizador ReturnUserData()
        {

            
            using (var tmp= new CloudPtContext())
            {
                var tmpquery = (from t in tmp.DadosUtilizador select t).SingleOrDefault();

                
                if (tmpquery!=null)
                {
                    var tmpConvites = new ConvitesUtilizador
                    {
                        ConvitesQuotas = tmpquery.CloudPtQuotaInvites,
                        Enviados = tmpquery.CloudPtConvitesEnviados
                    };
                    var tmpQuota = new InformacaoQuota
                    {
                        Quota = tmpquery.CloudPtQuota,
                        QuotaNormal = tmpquery.CloudPtQuotaNormal,
                        QuotaPartilhada = tmpquery.CloudPtQuotaPartilhada
                    };
                    TmpUserDb = new Utilizador
                    {
                        NomeUtilizador = tmpquery.CloudPtNome,
                        OauthToken = tmpquery.CloudPtOauthToken,
                        OauthTokenSecret = tmpquery.CloudPtOauthTokenSecret,
                        MailUtilizador = tmpquery.CloudPtEmail,
                        DataCriacaoUtilizador = tmpquery.CloudPtCriacaoUtilizador,
                        UltimoAccessoUtilizador = tmpquery.CloudPtCriacaoUtilizador,
                        IdUtilizador = tmpquery.CloudPtUserId,
                        UserActivo = tmpquery.CloudPtUserActivo,
                        DadosConvites = tmpConvites,
                        DadosQuota = tmpQuota,

                    };

                }
            }
           
            

            return TmpUserDb;
        }
        #endregion
        
        #region SetUserInformation
        public void InjectUser(Utilizador value)
        {
            try
            {
                if(_context==null)
                {
                    _context= new CloudPtContext();
                }

                _context.DadosUtilizador.InsertOnSubmit(new TbUtilizador
                {
                   
                    CloudPtEmail = value.MailUtilizador,
                    CloudPtNome = value.NomeUtilizador,
                    CloudPtUserId = value.IdUtilizador,
                    CloudPtCriacaoUtilizador = value.DataCriacaoUtilizador,
                    CloudPtUltimoAcesso = value.UltimoAccessoUtilizador,
                    CloudPtOauthToken = value.OauthToken,
                    CloudPtOauthTokenSecret = value.OauthTokenSecret
                });

                _context.SubmitChanges();
            }

            catch (Exception e)
            {
                EventAggregationProvider.Aggregator.Publish(e.InnerException != null
                                                                ? new AppMessage(AppMessageType.DbInsertError,
                                                                                 e.InnerException.ToString())
                                                                : new AppMessage(AppMessageType.DbInsertError, e.Message));
            }
           

            EventAggregationProvider.Aggregator.Publish(new AppMessage(AppMessageType.DbInsertOk, "UserDataOK"));
        }
        #endregion

        #endregion
    }

    #endregion
}